package gitee_hook

import (
	"strconv"

	"atomgit.com/openlinksaas-org/proto-gen-go.git/events/events_gitee"
)

type PullRequestHook struct {
	HookId         int32                `json:"hook_id"`          // 钩子 id。
	HookUrl        string               `json:"hook_url"`         // 钩子路由。
	HookName       string               `json:"hook_name"`        // 钩子名，固定为 merge_request_hooks。
	Password       string               `json:"password"`         // 钩子密码。eg：123456
	Timestamp      string               `json:"timestamp"`        // 触发钩子的时间戳。eg: 1576754827988
	Sign           string               `json:"sign"`             // 钩子根据密钥计算的签名。eg: "rLEHLuZRIQHuTPeXMib9Czoq9dVXO4TsQcmQQHtjXHA="
	Action         string               `json:"action"`           // PR 状态。eg：open
	PullRequest    *PullRequest         `json:"pull_request"`     // PR 的信息。
	Number         int32                `json:"number"`           // PR 的 id。
	Iid            int32                `json:"iid"`              // 与上面 number 一致。
	Title          string               `json:"title"`            // PR 的标题。eg：这是一个 PR 标题
	Body           *string              `json:"body"`             // PR 的内容。eg：升级服务...
	State          string               `json:"state"`            // PR 状态。eg：open
	MergeStatus    string               `json:"merge_status"`     // PR 的合并状态。eg：unchecked
	MergeCommitSha string               `json:"merge_commit_sha"` // PR 合并产生的 commit id。eg：51b1acb1b4044fcdb2ff8a75ad15a4b655101754
	Url            string               `json:"url"`              // PR 在 Gitee 上 url。eg：https://gitee.com/oschina/pulls/1
	SourceBranch   *string              `json:"source_branch"`    // PR 的源分支名。eg：fixbug
	SourceRepo     ProjectAndRepository `json:"source_repo"`      // PR 的源仓库信息
	TargetBranch   string               `json:"target_branch"`    // PR 的目标分支名。master
	TargetRepo     ProjectAndRepository `json:"target_repo"`      // PR 的目标仓库信息
	Project        *Project             `json:"project"`          // PR 的目标仓库信息。
	Repository     *Project             `json:"repository"`       // PR 的目标仓库信息。
	Author         *User                `json:"author"`           // PR 的创建者信息。
	UpdatedBy      *User                `json:"updated_by"`       // PR 的更新者信息。
	Sender         *User                `json:"sender"`           // PR 的更新者信息。
	TargetUser     *User                `json:"target_user"`      // 被委托处理 PR 的用户信息。
	Enterprise     *Enterprise          `json:"enterprise"`       // PR 仓库所在的企业信息。
}

func (item *PullRequestHook) ToProtoBuf() *events_gitee.PullRequestEvent {
	ret := &events_gitee.PullRequestEvent{
		HookId:         item.HookId,
		HookUrl:        item.HookUrl,
		HookName:       item.HookName,
		Sign:           item.Sign,
		Action:         item.Action,
		PullRequest:    []*events_gitee.PullRequest{},
		Number:         item.Number,
		Iid:            item.Iid,
		Title:          item.Title,
		Body:           []string{},
		State:          item.State,
		MergeStatus:    item.MergeStatus,
		MergeCommitSha: item.MergeCommitSha,
		Url:            item.Url,
		SourceBranch:   []string{},
		SourceRepo:     []*events_gitee.Project{},
		TargetBranch:   item.TargetBranch,
		TargetRepo:     []*events_gitee.Project{},
		Project:        []*events_gitee.Project{},
		Author:         []*events_gitee.User{},
		UpdatedBy:      []*events_gitee.User{},
		Sender:         []*events_gitee.User{},
		TargetUser:     []*events_gitee.User{},
		Enterprise:     []*events_gitee.Enterprise{},
	}
	if item.PullRequest != nil {
		ret.PullRequest = append(ret.PullRequest, item.PullRequest.ToProtoBuf())
	}
	if item.Body != nil && *item.Body != "" {
		ret.Body = append(ret.Body, *item.Body)
	}
	if item.SourceBranch != nil && *item.SourceBranch != "" {
		ret.SourceBranch = append(ret.SourceBranch, *item.SourceBranch)
	}
	sourcePrj := item.SourceRepo.ToProtoBuf()
	if sourcePrj != nil {
		ret.SourceRepo = append(ret.SourceRepo, sourcePrj)
	}
	targetPrj := item.TargetRepo.ToProtoBuf()
	if targetPrj != nil {
		ret.TargetRepo = append(ret.TargetRepo, targetPrj)
	}
	if item.Project != nil {
		ret.Project = append(ret.Project, item.Project.ToProtoBuf())
	}
	if item.Author != nil {
		ret.Author = append(ret.Author, item.Author.ToProtoBuf())
	}
	if item.UpdatedBy != nil {
		ret.UpdatedBy = append(ret.UpdatedBy, item.UpdatedBy.ToProtoBuf())
	}
	if item.Sender != nil {
		ret.Sender = append(ret.Sender, item.Sender.ToProtoBuf())
	}
	if item.TargetUser != nil {
		ret.TargetUser = append(ret.TargetUser, item.TargetUser.ToProtoBuf())
	}
	if item.Enterprise != nil {
		ret.Enterprise = append(ret.Enterprise, item.Enterprise.ToProtoBuf())
	}
	ret.Timestamp, _ = strconv.ParseInt(item.Timestamp, 10, 64)
	return ret
}
